跳到主要内容

Go 操作 Redis 之 redigo 库

redigo 项目地址

因为这个工具主要是发送命令的形式操作 Redis,所以可以参考下 Redis 的命令

读写数据

import (
"fmt"
"github.com/gomodule/redigo/redis"
"time"
)

func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()

// n, err := conn.Do("APPEND", "key", "value")
// 这里后面携带的 EX 参数设置超时,等价于 SET name lisa EX 5 命令
_, err = c.Do("SET", "name", "lisa", "EX", "15")
if err != nil {
fmt.Println("redis set failed:", err)
}

username, err := redis.String(c.Do("GET", "name"))

if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get mykey: %v \n", username)
}

time.Sleep(18 * time.Second)

username, err = redis.String(c.Do("GET", "name"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get name: %v \n", username)
}
}

可以看到已经把数据插进来了(超时前看)

输出

Get mykey: lisa 
redis get failed: redigo: nil returned

这里读取数据的类型转换可以使用自带的包

批量写入与读取

_, err = c.Do("LPUSH","number","one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten")

或者批量插入 Key Value

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()

//arr := []string{"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"}
// MSET key1 "Hello" key2 "World"
_, err = c.Do("MSET",
"name", "lisa",
"sex", "female")

isKeyExit, err := redis.Bool(c.Do("EXISTS", "name"))

if err != nil {
fmt.Println("error:", err)
} else {
fmt.Printf("Is name key exists ? : %v \n", isKeyExit)
}

reply, err := redis.Values(c.Do("MGET", "name", "sex"))
if err != nil {
fmt.Printf("patch get name & sex error \n。")
} else {
var name string
var sex string
// 使用 Scan 绑定数据
_, err := redis.Scan(reply, &name, &sex)
if err != nil {
fmt.Printf("Scan error \n。")
} else {
fmt.Printf("The name is %v, sex is %v \n", name, sex)
}
}
}

读写 JSON

反序列化和序列化

import (
"encoding/json"
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()

key := "profile"

// 序列化
imap := map[string]string{"name": "lisa", "sex": "male", "mobile": "1234567"}
value, _ := json.Marshal(imap) // 序列化

// SETNX = SET if Not Exists => https://redis.io/commands/setnx
n, err := c.Do("SETNX", key, value)
if err != nil {
fmt.Println(err)
}

if n == int64(1) {
fmt.Println("set Json key success")
}


// 反序列化
var imapGet map[string]string
valueGet, err := redis.Bytes(c.Do("GET", key))
if err != nil {
fmt.Println(err)
}

err1 := json.Unmarshal(valueGet, &imapGet)
if err1 != nil {
fmt.Println(err1)
}
fmt.Println(imapGet["name"])
fmt.Println(imapGet["sex"])
fmt.Println(imapGet["mobile"])
}

输出:

set Json key success
lisa
male
1234567